function $(arg) {
	return new jQuery(arg);
}
function jQuery(arg) {
	this.elements = [];
	// $("div")  $(dom)  $(function(){})
	if (typeof arg == "string") {
		//相当于执行选择器功能  如：jQuery("#main")
			this.elements = this.getEl(arg);
	} else if (typeof arg == "function") {
		//相当于执行载入函数 如 jQuery(function(){})
		//$(document).ready(function(){})
		//$(function(){})
		this.ready(arg);
	}else{
		//var arr = [];
		// typeof arr == object
		// arr instanceof Array
		if(arg instanceof HTMLDivElement){
			// 单个DOM元素
		}else if(arg instanceof NodeList){
			//DOM元素数组
		}
//		arg = [arg];
		this.elements.push(arg);
	}
};

jQuery.prototype.on = function(eName,fn){
	this._addEvent(eName,fn);
};
// $("").click()
// $("").on("click")
jQuery.prototype.click = function(fn) {
	this._addEvent("click",fn);
};
jQuery.prototype._addEvent = function(eName,fn){
	for(var i=0;i<this.elements.length;i++){
		if(document.addEventListener){
			this.elements[i].addEventListener(eName,fn,false);
		}else{
			this.elements[i].attachEvent("on"+eName,fn);
		}
	}
};
// $(function(){页面载入})
jQuery.prototype.ready = function(fn){
	//	DOMContentLoaded  DOM解析完毕事件
	if(document.addEventListener){
		document.addEventListener("DOMContentLoaded",fn,false);
	}else{
		//待测试
		var os = document.createElement("script");
		os.defer = true;
		os.onreadystatechange = function(){
			if(os.readyState == "complete"){
				fn();
			}
		}
		var h = document.getElementsByTagName("head")[0];
		h.appendChild(os);
	}
};
jQuery.prototype._toUpper = function(str) {
	// $().css("border-radius");
	//判断用户传入的属性值是否包含横线，如果包含需要改为驼峰命名
	if (/-/.test(str)) {
		//str = "ba-co";
		str = str.replace(/-[a-z]/, function(a) {
			//  a = "-c";
			return a.charAt(1).toUpperCase();
		});
	}
	return str;
};
jQuery.prototype._getStyle = function(ele, sName) {
	/**
	 *
	 *通过document.getElementById(element).style.xxx可以获取元素的样式信息
	 * 但是对于通过class属性引用的外部样式表就获取不到了
	 * * 获取元素的计算后样式需要用到 getComputedStyle方法
	 * 该方法返回一个 样式对象 如：{
	 * 	backgrounColor:rgb(0,0,0),
	 * width : 100
	 * }
	 * 但IE8及以下没有这个方法，需要使用其专有属性 currentStyle
	 * 该属性也是返回一个样式对象
	 */
	if (ele.currentStyle) {
		return ele.currentStyle[sName];
	} else {
		return getComputedStyle(ele, null)[sName];
	}
};
//$().css("width",100);
jQuery.prototype._addPx = function(sName, sVal) {
	var arr = ["width", "height", "left", "top", "bottom", "right"];
	for (var i = 0; i < arr.length; i++) {
		if (arr[i] == sName && /^\d+$/.test(sVal)) {
			sVal += "px";
		}
	}
	return sVal;
};
jQuery.prototype._setStyle = function(sName, sVal) {
	for (var i = 0; i < this.elements.length; i++) {
		var _sVal = this._addPx(sName, sVal);
		this.elements[i].style[sName] = _sVal;
	}
};
// $("").css("color","red");

// .css({
// 	colro:
// })
// .css("color")
jQuery.prototype.css = function() {
	if (arguments.length == 1) {
		//如果参数长度为1 则
		//有可能是获取样式 .css("width")
		//有可能是通过JSON对象设置多个样式 .css({width:100,height:100})
		var arg = arguments[0];
		if (typeof arg == "string") {
			// $(el).css("background-color" "backgroundColor")
			//如果是string   则：.css("width")  获取样式
			//background-color backgroundColor 两种都有可能
			//获取计算后的样式则一律需要驼峰式命名
			arg = this._toUpper(arg);
			var sVal = this._getStyle(this.elements[0], arg);
			return sVal;
		} else {
			//JSON格式设置样式
			/**
			 * arg = {
			 * 	width:100,
			 * height:200
			 * }
			 */
			for (var key in arg) {
				// sName = key   sVal=arg[key]
				this._setStyle(key,arg[key])
			}
		}
	} else {
		this._setStyle(arguments[0],arguments[1]);
	}
	return this;
}
// $("div").first();
jQuery.prototype.first = function() {
	return this.elements[0];
};
jQuery.prototype.log = function(str) {
	window.console && console.log(str);
};
jQuery.prototype.trim = function(str) {
	//截取前后空格   string.trim()
	return str.replace(/^\s+|\s+$/g, "");
};
//jQuery.fn = jQuery.prototype;//定义一个便捷的名字 不是必须 是偷懒行为
jQuery.prototype.getEl = function(sel) {
	sel = this.trim(sel);
	var parents = [];
	var childrens = [document];

	//$("div span")

	sel = sel.replace(/\s+/g, " ");
	sel = sel.split(" ");
	//document.getId getClass getTagName
	// "#main span" "div span em"
	// var eles = docum.getEsByTagName("div");
	// [div,div]
	for (var m = 0; m < sel.length; m++) {
		parents = childrens;
		childrens = [];
		$("div span")

		for (var i = 0; i < parents.length; i++) {
			if (sel[m].charAt(0) == "#") {
				this.log("ID选择器");
				var _sel = sel[m].substring(1);
				this.log(parents[i])
				var ele = document.getElementById(_sel);
				childrens.push(ele);
			} else if (sel[m].charAt(0) == ".") {
				".box span"
				this.log("class选择器");
				var _sel = sel[m].substring(1);
				var eles = this.byClass(parents[i], _sel);
				for (var k = 0; k < eles.length; k++) {
					childrens.push(eles[k]);
				}
				//						childrens = eles;
			} else {
				//属性选择器 如：div[name=...] div[name]
				if (/\[/.test(sel[m])) {
					this.log("标签-属性选择器");
					childrens = this.byAttr(parents[i], sel[m]);
				} else if (/\.|#/.test(sel[m])) { //组合选择器 如：div.wrap 选择class为wrap的div  div#main
					this.log("标签-组合选择器")
				} else { //纯标签选择器  div    span 等
					this.log("纯标签选择器");
					var eles = parents[i].getElementsByTagName(sel[m]);
					for (var k = 0; k < eles.length; k++) {
						childrens.push(eles[k]);
					}
				}
			}
		}
	}
	return childrens;
};

jQuery.prototype.byClass = function(parent, sel) {
	//IE8及以下不支持getElemntsByClassName方法，所以处理一下兼容性
	if (parent.getElementsByClassName) {
		//如果支持byClassName方法   直接返回选择到的元素
		return parent.getElementsByClassName(sel);
	}
	//获取元素下所有元素的方法 （包括深层次的元素）
	//IE8及以下的获取方法
	var eles = parent.getElementsByTagName("*");
	// \b 单词边界
	//  "abc def ghi"
	//  "#main .box"
	var reg = new RegExp("\\b" + sel + "\\b");
	var arr = []; //用于存放匹配到的元素
	for (var i = 0; i < eles.length; i++) {
		//得到每一个元素 得到每一个元素的class名称
		var ele = eles[i],
			cName = ele.className;
		// wrap
		// "wrap" "wrap wrap2 wrap3"
		if (reg.test(cName)) {
			arr.push(ele);
		}
	}
	return arr;
};
jQuery.prototype.byAttr = function(parent, sel) {
	//div[name*=abc
	sel = sel.substring(0, sel.length - 1); //div[name
	sel = sel.split("["); //sel = [div,name];
	var parents = parent.getElementsByTagName(sel[0]);
	var arr = [];
	for (var i = 0; i < parents.length; i++) {
		var p = parents[i];
		if (/\*/.test(sel[1])) { //如果是 [name*=wrap]
			this.log("*=");
			var _sel = sel[1].split("*=");
			//_sel[1] = wrap 构建正则匹配wrap的单词边界
			var reg = new RegExp("" + _sel[1] + "");
			//如果能够匹配到
			if (reg.test(p.getAttribute(_sel[0]))) {
				arr.push(p);
			}
		} else if (/\^/.test(sel[1])) { // [name^=wrap]
			log("^=")
		} else if (/\$/.test(sel[1])) { // [name$=wrap]
			log("$=")
		} else { // [name]
			log("只有属性")
		}
	}
	return arr;
};
